/*
* Copyright 2005-2008 Pulse Technologies. Tutti i diritti riservati.
*/
package org.obsidianrad.server.services.obj2db.dao;

import org.obsidianrad.server.services.ObsModel;
import org.obsidianrad.server.services.obj2db.commodities.Filterer;
import org.obsidianrad.server.services.obj2db.commodities.PagingLoadConfig;
import org.obsidianrad.server.services.obj2db.commodities.PagingLoadResult;
import org.obsidianrad.utils.ObjProxyException;


/**
 * 
 * @author Eligio Colutta
 * @version $Rev: 4 $
 * @lastautorcommit $Author: eliosh $
 * @lastdatecommit $Date: 2009-10-31 12:37:28 +0100(sab, 31 ott 2009) $
 */
public interface GenericDAO<T extends ObsModel> {

	public String getListMapName();
	public String getListCountMapName();
	
	public String getCriteriaListMapName();
	public String getCriteriaListCountMapName();
	
	public String getSingleMapName();
	public String getSaveMapName();
	
	public String getDeleteOneMapName();
	public String getDeleteManyMapName();

	public String getUpdateOneMapName();
	public String getUpdateManyMapName();
	

	/**
	 * Carica un singolo oggetto, fornendo la sua chiave primaria
	 * @param reference Oggetto di tipo T, con almeno la chiave primaria
	 * @return Oggetto che estende la classe BaseModel con chiave primaria uguale a "id". Null altrimenti.
	 * @throws ObjProxyException
	 */
	public T getSingle(T reference) throws ObjProxyException;
	
	/**
	 * Recupera una lista di oggetti, passandone uno come "ricercatore"
	 * @param reference Oggetto da cui prendiamo i valori da usare come filtro
	 * @param config Oggetto configuratore per limitare il numero di risultati
	 * @return Lista di oggetti che rispecchiano i filtri applicati. Null altrimenti.
	 * @throws ObjProxyException
	 */
	public PagingLoadResult<T> getList(T reference, PagingLoadConfig config) throws ObjProxyException;
	
	/**
	 * Recupera una lista di oggetti, passando un "filtratore"
	 * @param config Oggetto configuratore per limitare il numero di risultati
	 * @return Lista di oggetti che rispecchiano i filtri applicati. Null altrimenti.
	 * @throws ObjProxyException
	 */
	public PagingLoadResult<T> getList(Filterer reference, PagingLoadConfig config) throws ObjProxyException;
	
	/**
	 * Salva un oggetto di tipo T che estende la classe BaseModel
	 * @param reference Oggetto da salvare
	 * @return
	 * @throws ObjProxyException In caso di errori nel backend, solleva eccezione.
	 */
	public String save(T reference) throws ObjProxyException;
	
	/**
	 * Aggiorna un oggetto nel database.
	 * @param reference Oggetto da aggiornare
	 * @return Lo stesso oggetto, aggiornato.
	 * @throws ObjProxyException In caso l'oggetto non è stato trovato, solleva eccezione.
	 */
	public T updateOne(T reference) throws ObjProxyException;
	
	/**
	 * Aggiorna un insieme di oggetti nel database
	 * @param reference Oggetto da cui prendere i filtri
	 * @return Numero di oggetti sottoposti a modifica
	 * @throws ObjProxyException
	 */
	public int updateMany(Filterer reference) throws ObjProxyException;
	
	/**
	 * Cancella un oggetto, prendendo l'oggetto passato come filtro per la ricerca. Limitato ad un solo oggetto.
	 * @param reference Oggetto da utilizzare per cercare l'oggetto da cancellare.
	 * @return Numero di oggetti cancellati.
	 * @throws ObjProxyException
	 */
	public void deleteOne(T reference) throws ObjProxyException;
	
	/**
	 * Cancella un oggetto, prendendo l'oggetto passato come filtro per la ricerca. Può cancellarne più di uno.
	 * @param reference Oggetto da utilizzare per cercare gli oggetti da cancellare.
	 * @return Numero di oggetti cancellati.
	 * @throws ObjProxyException
	 */
	public Integer deleteMany(Filterer reference) throws ObjProxyException;
	
	
}
